#ifndef __UIACTIVEX_H__
#define __UIACTIVEX_H__

#pragma once

struct IOleObject;


namespace DuiLib {
    /////////////////////////////////////////////////////////////////////////////////////
    //

    class CActiveXCtrl;

    template< class T >
    class CSafeRelease
    {
    public:
        CSafeRelease(T* p) : m_p(p) { };
        ~CSafeRelease() { if( m_p != NULL ) m_p->Release(); };
        T* Detach() { T* t = m_p; m_p = NULL; return t; };
        T* m_p;
    };

    /////////////////////////////////////////////////////////////////////////////////////
    //

    class UILIB_API CActiveXUI : public CControlUI, public IMessageFilterUI
    {
        DECLARE_DUICONTROL(CActiveXUI)

        friend class CActiveXCtrl;
    public:
        CActiveXUI();
        virtual ~CActiveXUI();

        LPCTSTR GetClass() const;
        LPVOID GetInterface(LPCTSTR pstrName);

        HWND GetHostWindow() const;

        virtual bool IsDelayCreate() const;
        virtual void SetDelayCreate(bool bDelayCreate = true);
        virtual bool IsMFC() const;
        virtual void SetMFC(bool bMFC = false);

        bool CreateControl(const CLSID clsid);
        bool CreateControl(LPCTSTR pstrCLSID);
        HRESULT GetControl(const IID iid, LPVOID* ppRet);
        CLSID GetClisd() const;
        CDuiString GetModuleName() const;
        void SetModuleName(LPCTSTR pstrText);

        void SetVisible(bool bVisible = true);
        void SetInternVisible(bool bVisible = true);
        void SetPos(RECT rc, bool bNeedInvalidate = true);
        void Move(SIZE szOffset, bool bNeedInvalidate = true);
        bool DoPaint(HDC hDC, const RECT& rcPaint, CControlUI* pStopControl);

        void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);

        LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);

    protected:
        virtual void ReleaseControl();
        virtual bool DoCreateControl();

    protected:
        CLSID m_clsid;
        CDuiString m_sModuleName;
        bool m_bCreated;
        bool m_bDelayCreate;
        bool m_bMFC;
        IOleObject* m_pUnk;
        CActiveXCtrl* m_pControl;
        HWND m_hwndHost;
    };

} // namespace DuiLib

#endif // __UIACTIVEX_H__
